home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
basic
/
inpout.zip
/
INPOUT.ASM
next >
Wrap
Assembly Source File
|
1991-08-31
|
3KB
|
128 lines
;InpOut.DLL
;Inp and Out Visual Basic Keyword replacements
;Copyright 1991 Crescent Software
;Written by Jay Munro
;
.286
.Model Medium
Public Inp,Out,Wep
Extrn UnlockSegment:Proc ;use LibW.LIB from Win SDK
Extrn LocalInit:Proc
WinProlog Macro
Push DS ;useless setup code
Pop AX
Nop
Inc BP ;adjust BP
Push BP
Mov BP,SP ;set up stack frame
Push DS
Mov DS,AX
EndM
WinEpilog Macro
Dec BP
Dec BP
Mov SP,BP
Pop DS
Pop BP
Dec BP
EndM
.Data
Required_Data_Header DB 16 dup (?) ;as required by Windows for .ASM Dlls
INIT_TEXT SEGMENT BYTE PUBLIC 'CODE'
Assume CS:INIT_TEXT
LibEntry Proc Far
WinProlog
push di ; handle of the module instance
push ds ; library data segment
push cx ; heap size
; if we have some heap then initialize it
jcxz CallMain ; jump if no heap specified
; call the Windows function LocalInit() to set up the heap
; LocalInit((LPSTR)start, WORD cbHeap);
xor ax,ax
Push DS
Push AX
Push CX
Call LocalInit
Or ax,ax ; did it do it ok ?
Jz error ; quit if it failed
; invoke the asm routine to do any special initialization
CallMain:
Call Far Ptr LibMain ; invoke the startup routine (result in AX)
Jmp short exit ; LibMain is responsible for stack clean up
error:
pop cx
pop ds
pop di
exit:
WinEpilog
Ret
LibEntry EndP
INIT_TEXT EndS
.Code
; Libmain gets these parameters
; parmW hInstance ;handle [bp+14]
; parmW hDataSeg ;word [bp+12]
; parmW cbHeapSize ;word [bp+10]
LibMain Proc Far
WinProlog ;windows prolog code
Push -1 ;unlock data segment (just in case)
Call UnlockSegment
Mov AX,1 ;return a 1 to caller
WinEpilog ;windows epilog code
Ret 6 ;3 variables (6 bytes)
LibMain EndP
Wep Proc Far
WinProlog
Mov AX,1
WinEpilog
Ret
Wep EndP
;Declare Function Inp Lib "InpOut.DLL" (Port%) as Integer
;PortNumb% = &h378
;PortValue% = Inp(PortNumb%)
Inp Proc Far
WinProlog ;standard prolog macro
Mov DX,[BP+6] ;load DX with port to check out
In AL,DX ;input a byte
Xor AH,AH ;clear high byte for return in AX
WinEpilog ;standard epilog macro
Ret 2
Inp EndP
;Declare Sub Out Lib "InpOut.DLL" (Port%,Value%)
;PortNumb% = &h378 ;for example only, don't try this
;Value% = 65
;Out PortNumb%,Value%
Out Proc Far ;Warning errors can be ignored!
WinProlog ;standard prolog macro
Mov AL,[BP+6] ;get data value into AL (bytes only)
Mov DX,[BP+8] ;get port value into DX
Out DX,AL ;output the byte
WinEpilog ;standard epilog macro
Ret 4 ;return clearing 4 bytes off stack
Out EndP
End